package com.nettyBasic.n4_futureAndPromise;

import io.netty.channel.EventLoop;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.util.concurrent.DefaultPromise;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutionException;

/**
 * @author： pang-yun
 * @date： 2021-09-13 11:54
 * 功能目的 ：用于
 */
@Slf4j
public class NettyPromise {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
       // 1. 准备 eventLoop 对象
        EventLoop eventLoop = new NioEventLoopGroup().next();

        // 2. 可以主动创建 promise   作为结果容器  （可以手动创建 而不是向 future一样被动）
        DefaultPromise<Integer> defaultPromise = new DefaultPromise<>(eventLoop);

        // 3. 任意一个线程执行计算
        new Thread(()->{
            // 3. 任意一个线程执行结果 计算完毕之后 向 promise 填充结果
            log.info("beginning  calculate--------");
            try {
               // int i=1/0;
                Thread.sleep(1000);
                defaultPromise.setSuccess(88);  // 将结果放入容器中
            } catch (InterruptedException e) {
                e.printStackTrace();
                defaultPromise.setFailure(e);
            }
        },"optional").start();

        log.info("waiting.....");
        Integer integer = defaultPromise.get();
        log.info("result: {}",defaultPromise.getNow());
    }
}
